﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using CruzDelSur.Dominio;
using NHibernate;
using NHibernate.Criterion;

namespace CruzDelSur.Persistencia
{
    public class PromocionDAO : BaseDAO<Promocion, string>, IPromocionDAO
    {
        public ICollection<Promocion> obtenerListado()
        {
            using (ISession sesion = NHibernateHelper.AbrirSesion())
            {
                ICollection<Promocion> resultado = sesion.CreateCriteria<Promocion>()
                    .List<Promocion>();
                return resultado;
            }
        }

        public Promocion obtenerPromocionDetalle(string codigo)
        {
            Promocion promocion = this.Obtener(codigo);
            promocion.Detalle = this.obtenerDetalle(promocion);
            return promocion;
        }

        public IList<PromocionDetalle> obtenerDetalle(Promocion promocion)
        {
            using (ISession sesion = NHibernateHelper.AbrirSesion())
            {
                IList<PromocionDetalle> result = sesion.CreateQuery("from PromocionDetalle where Codigo=:codigo")
                .SetString("codigo", promocion.Codigo)
                .List<PromocionDetalle>();
                if (result == null)
                {
                    return new List<PromocionDetalle>();
                }
                else
                {
                    return result;
                }

            }
        }

        public void guardarDetalle(Promocion promocion)
        {
            using (ISession sesion = NHibernateHelper.AbrirSesion())
            {
                using (ITransaction transaccion = sesion.BeginTransaction())
                {
                    sesion.CreateQuery("delete from PromocionDetalle where Codigo=:codigo")
                    .SetString("codigo", promocion.Codigo)
                    .ExecuteUpdate();
                    foreach (PromocionDetalle item in promocion.Detalle)
                    {
                        item.Codigo = promocion.Codigo;
                        sesion.Save(item);
                    }
                    transaccion.Commit();
                }
            }
        }

        public ICollection<Promocion> obtenerListadoPendientes()
        {
            ICollection<Promocion> resultado = this.Listar(
                DetachedCriteria.For<Promocion>().Add(
                    Restrictions.Eq("Estado", Servicio.PENDIENTE)
                   )
                );
            return resultado;
        }
    }
}